unit TPS_Tambah_Orang;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ZAbstractTable, ZDataset, DB, ZAbstractRODataset,
  ZAbstractDataset, ZConnection, Setting, ExtCtrls;

type
  TPemilih2 = record
     ID:String;
     NIK:String;
     NKK:String;
     NAMA:String;
     TEMPAT:String;
     TANGGAL:String;
     IBU:String;
     AGAMA:String;
     KAWIN:String;
     KELAMIN:String;
     KELAINAN:String;
     ALAMAT:String;
     KOTA:String;
     KEC:String;
     DESA:String;
     RW:String;
     RT:String;
     KET:String;
  end;
  TTPemilih2 = array of TPemilih2;
  ttambah_orang = class(TForm)
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    ZTable1: TZTable;
    ZTable2: TZTable;
    ZQuery2: TZQuery;
    Panel1: TPanel;
    btn_tambah_orang: TButton;
    btnnext: TButton;
    Btnprev: TButton;
    Button3: TButton;
    Label3: TLabel;
    lblhal: TLabel;
    lblPemilih: TLabel;
    rtcombo: TComboBox;
    rwcombo: TComboBox;
    StringGrid1: TStringGrid;
    txtHal: TEdit;
    Label1: TLabel;
    Panel2: TPanel;
    title_tps: TLabel;
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure fetchdb();
    procedure FormCreate(Sender: TObject);
    procedure TampilHalamanTambah(Hal:Integer = 1);
    procedure btnnextClick(Sender: TObject);
    procedure BtnprevClick(Sender: TObject);
    procedure rwcomboChange(Sender: TObject);
    procedure rtcomboChange(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure btn_tambah_orangClick(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
  private
    function cekPemilihTPS(pemilih: TPemilih2): Boolean;
    function cekBufTPS(pemilih: TPemilih2): Boolean;
    function cekJmlTPS(tambah: Integer): Boolean;
    procedure AutoSizeCol(Grid: TStringGrid; Column: integer);
    { Private declarations }
  public
    { Public declarations }
    sKabkot:string;
    skec:string;
    sdesa:string;
    id_tps, namatps:string;
    srw:string;
    srt:string;
    crow2:integer;
    drow:integer;
    cHal:Integer; //current halaman
    jHal:Integer; //jumlah halaman
    bHal:Integer; //batas per halaman
    crow3:integer;
    drow2:integer;
    cHal2:Integer; //current halaman
    jHal2:Integer; //jumlah halaman
    bHal2:Integer; //batas per halaman
    bPemilih:TTPemilih2; //grid 1
    bTPS:TTPemilih2; //grid 2
    fData:Boolean;
    daftID:String;
    selectedrow1,selectedrow2:integer;
    constructor Create(AOwner: TComponent; kode_desa, idtps: String);             overload;

  end;

var
  tambah_orang: ttambah_orang;

implementation

{$R *.dfm}
constructor ttambah_orang.Create(AOwner: TComponent; kode_desa, idtps: String);
begin
    sdesa:=kode_desa;
    id_tps:=idtps;
    inherited Create(AOwner);
end;


procedure ttambah_orang.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure ttambah_orang.FormCreate(Sender: TObject);
var setting:TSetting_Form;
begin
  setting:=TSetting_Form.Create;
  ZConnection1.HostName:=setting.host;
  ZConnection1.Protocol:=setting.protocol;
  ZConnection1.Database:=setting.database;
  ZConnection1.User:=setting.user;
  ZConnection1.Password := setting.password;
  ZConnection1.LoginPrompt := False;
  ZConnection1.Connected := True;
  ZQuery1.Connection:=ZConnection1;
  ZQuery2.Connection:=ZConnection1;
  ZTable1.Connection:=ZConnection1;
  ZTable2.Connection:=ZConnection1;

  with ZTable1 do
  begin
    active:=false;
    tablename:='daftar_tps';
    filter:='ID_TPS='+id_tps;
    filtered:=true;
    active:=true;
    first;
    namatps:=FieldByName('NAMA').AsString;
    title_tps.Caption:='Tambah orang untuk TPS '+FieldByName('NAMA').AsString;
  end;
  ZQuery2.Active := False;
  ZQuery2.SQL.Text:='SELECT DISTINCT(RW) FROM pemilih_'+sdesa;
  ZQuery2.Active := True;
  ZQuery2.First;  //tabel simpan
  rwcombo.Clear;
  while (not ZQuery2.Eof) do
  begin
    rwcombo.Items.Add(ZQuery2.FieldByName('RW').AsString);
    ZQuery2.Next;
  end;

  ZTable1.Active := False;
  ZTable1.TableName := 'kabkot';
  ZTable1.Active := True;
  ZTable1.First;
  sKabkot:='';
  sKec:='';
  crow2:=2;  //wadah row
  crow3:=2;
  dRow:=1;  //menyimpan banyaknya data
  drow2:=1;
  lblHal.Caption:= '-';
  txtHal.Enabled:=False;
  btnPrev.Enabled:=False;
  btnNext.Enabled:=False;
  //grid 1
  StringGrid1.Cells[0,0]:='NO';
  StringGrid1.Cells[1,0]:='NIK';
  StringGrid1.Cells[2,0]:='NKK';
  StringGrid1.Cells[3,0]:='Nama';
  StringGrid1.Cells[4,0]:='Tempat Lahir';
  StringGrid1.Cells[5,0]:='Tanggal Lahir';
  StringGrid1.Cells[6,0]:='Nama Ibu';
  StringGrid1.Cells[7,0]:='Agama';
  StringGrid1.Cells[8,0]:='Perkawinan';
  StringGrid1.Cells[9,0]:='Jenis Kelamin';
  StringGrid1.Cells[10,0]:='Kelainan';
  StringGrid1.Cells[11,0]:='Alamat';
  StringGrid1.Cells[12,0]:='Kota';
  StringGrid1.Cells[13,0]:='Kecamatan';
  StringGrid1.Cells[14,0]:='Desa';
  StringGrid1.Cells[15,0]:='RW';
  StringGrid1.Cells[16,0]:='RT';
  StringGrid1.Cells[17,0]:='Ket';
  StringGrid1.RowCount:=crow2;

  SetLength(bTPS,1);
end;



procedure ttambah_orang.rtcomboChange(Sender: TObject);
begin
if (rtcombo.ItemIndex > 0) then
  begin
    srt := rtcombo.Items[rtcombo.ItemIndex];
    {ZQuery2.Active := False;
    ZQuery2.SQL.Text:='SELECT * FROM pemilih_'+sdesa+' where RW='+QuotedStr(srw)+' and RT='+QuotedStr(srt;
    ZQuery2.Active := True;
    ZQuery2.First;  //tabel simpan}
    fetchdb;
  end
    else
  begin
    srt:='';
  end;
end;

procedure ttambah_orang.rwcomboChange(Sender: TObject);
var
  i:Integer;
begin
if (rwcombo.ItemIndex > -1) then
  begin
    srw := rwcombo.Items[rwcombo.ItemIndex];

    rtcombo.Clear;
    rtcombo.Items.Add('PILIH RT');
    rtcombo.ItemIndex:=0;

    ZQuery2.Active := False;
    ZQuery2.SQL.Text:='SELECT DISTINCT(RT) FROM pemilih_'+sdesa+' where RW="'+srw+'"';
    ZQuery2.Active := True;
    ZQuery2.First;  //tabel simpan
    while (not ZQuery2.Eof) do
    begin
      rtcombo.Items.Add(ZQuery2.FieldByName('RT').AsString);
      ZQuery2.Next;
    end;
    for i := 1 to StringGrid1.RowCount - 1
    do StringGrid1.Rows[i].Clear;
  end
    else
  begin
    srw:='';
    srt:='';
  end;
end;

procedure ttambah_orang.StringGrid1Click(Sender: TObject);
begin
  if ((StringGrid1.Row>0)and(stringgrid1.Cells[0,1]<>'')and(cHal>0)) then begin
      selectedrow1:=stringgrid1.Row+ ((cHal-1)*bHal);
  end;
end;


procedure ttambah_orang.btnnextClick(Sender: TObject);
begin
  TampilHalamanTambah(cHal+1);
  txtHal.Text:=IntToStr(cHal);
end;

procedure ttambah_orang.BtnprevClick(Sender: TObject);
begin
  TampilHalamanTambah(cHal-1);
  txtHal.Text:=IntToStr(cHal);
end;


procedure ttambah_orang.btn_tambah_orangClick(Sender: TObject);
var
  vrow,i:integer;
  temp:TPemilih2;
  jumlahtps, inputan : integer;
begin
  if((selectedrow1<>0) and(StringGrid1.RowCount>=2) and(StringGrid1.Cells[0,1]<>''))then
  begin
    //cek bung lebih ndak
    temp:=bPemilih[selectedrow1];
    with ztable1 do
    begin
      active:=false;
      tablename:='pemilih_'+sdesa;
      filter:='ID_TPS='+id_tps;
      filtered:=true;
      active:=true;
      first;
      jumlahtps := RecordCount;
    end;
    if(temp.NKK<>'')then
    begin
      with ztable1 do
      begin
        active:=false;
        tablename:='pemilih_'+sdesa;
        filter:='NKK='+QuotedStr( temp.NKK);
        filtered:=true;
        active:=true;
        first;
        inputan := RecordCount;
      end;
    end
    else inputan := 1;

    if(jumlahtps+inputan>600)then
    begin
      showmessage('Maaf data tidak dapat dimasukkan karena jumlah orang tps saat ini '+IntToStr(jumlahtps)+' sedangkan akan diinput sebanyak '+IntToStr(inputan)+' sehingga akan melebihi kuota tps');
    end
    else
    begin
      if(temp.NKK<>'')then
      begin
        with ZQuery1 do
        begin
          Active:=False;
          sql.Clear;
          sql.Text:='UPDATE pemilih_'+sdesa+' SET TPS='+id_tps+' WHERE NKK='+QuotedStr(temp.NKK);
          ExecSQL;
        end;
      end
      else
      begin
        with ZQuery1 do
        begin
          Active:=False;
          sql.Clear;
          sql.Text:='UPDATE pemilih_'+sdesa+' SET TPS='+id_tps+' WHERE ID_USER='+QuotedStr(temp.ID);
          ExecSQL;
        end;
      end;
    end;
    ShowMessage('Sudah ditambahkan');
    fetchdb;
  end;
end;

procedure ttambah_orang.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure ttambah_orang.Button2Click(Sender: TObject);
var
  I:Integer;
  sInto,kodep:String;
  sLine:String;
  ktabel,kacuan,kid,bid:String;
begin
    ZTable1.Active := False;
    ZTable1.TableName := 'daftar_tps';
    ZTable1.Filter := 'ID_TPS = '+id_tps+' AND KODE_DESA='+QuotedStr(sdesa);
    ZTable1.Filtered := True;
    ZTable1.Active := True;
    ZTable1.First;
    if (ZTable1.Fields[1].AsString <> '') then
    begin
      ShowMessage('Cek nama TPS, TPS ini telah ada tersimpan');
    end
//     else if (StringGrid2.Cells[1,1]='') then
//      ShowMessage('Isi dahulu pre TPS baru')
//    else
//      begin
//        with ZQuery1 do  //masukkin nih tps gan
//          begin
//            Active:=False;
//            sql.Clear;
//            sql.Text := 'INSERT INTO daftar_tps (NAMA, KODE_DESA, ALAMAT) VALUES ("'+AnsiUpperCase(namatps)+'","'+sdesa+'","'+AnsiUpperCase(alamat_tps.Text)+'")';
//            ExecSQL;
//
//            Active:=False;
//            sql.Clear;
//            sql.Text := 'SELECT * FROM daftar_tps WHERE NAMA='+QuotedStr(AnsiUpperCase(namatps))+' AND KODE_DESA='+QuotedStr(sdesa);
//            Active:=True;
//            First;
//          end;
//        daftID:=ZQuery1.FieldByName('ID_TPS').AsString;
//        //simpan per data di data_tps
//        for I := 1 to High(bTPS) do
//        begin
//          kodep:=Copy(bTPS[I].ID,17,(Length(bTPS[I].ID)-16));
//          with ZQuery1 do
//          begin
//            Active:=False;
//            SQL.Clear;
//            SQL.Text:='UPDATE pemilih_'+sdesa+' SET TPS='+daftID+' WHERE ID_USER='+QuotedStr(kodep);
//            ExecSQL;
//          end;
//        end;
////        for i := 1 to StringGrid2.RowCount - 1
////        do StringGrid2.Rows[i].Clear;
////        SetLength(bTPS,1);
////        StringGrid2.RowCount:=2;
////        drow2:=1;
////        lblHal2.Caption:=IntToStr(drow2-1);
////        lblTPS.Caption:=IntToStr(drow2-1);
//        ShowMessage('TPS '+QuotedStr(AnsiUpperCase(namatps.Text))+' sudah disimpan');
//        fetchdb;
//    end;
end;

procedure ttambah_orang.Button3Click(Sender: TObject);
var
  I:Integer;
  vrow:Integer;
  temp:TPemilih2;
  jumlahtps, inputan:integer;
begin
  //tambah RT/RW
  //cek RT/RW ini sudah ada di TPS lain gak???
  if((sdesa<>'') and(srw<>'') and(srt<>'') )then
  begin
    //cek bung lebih ndak
    with ztable1 do
    begin
      active:=false;
      tablename:='pemilih_'+sdesa;
      filter:='ID_TPS='+id_tps;
      filtered:=true;
      active:=true;
      first;
      jumlahtps := RecordCount;
    end;
    with ztable1 do
    begin
      active:=false;
      tablename:='pemilih_'+sdesa;
      filter:='RW='+QuotedStr( srw)+' and RT='+QuotedStr(srt);
      filtered:=true;
      active:=true;
      first;
      inputan := RecordCount;
    end;

    if(jumlahtps+inputan>600)then
    begin
      showmessage('Maaf data tidak dapat dimasukkan karena jumlah orang tps saat ini '+IntToStr(jumlahtps)+' sedangkan akan diinput sebanyak '+IntToStr(inputan)+' sehingga akan melebihi kuota tps');
    end
    else
    begin
        with ZQuery1 do
        begin
          Active:=False;
          sql.Clear;
          sql.Text:='UPDATE pemilih_'+sdesa+' SET TPS='+id_tps+' WHERE RW='+QuotedStr(srw)+' and RT='+QuotedStr(srt);
          ExecSQL;
        end;
    end;
    ShowMessage('Sudah ditambahkan');
    fetchdb;
  end
    else
    ShowMessage('Pilih lokasi terlebih dahulu dan memiliki pemilih')
end;

function ttambah_orang.cekJmlTPS(tambah:Integer):Boolean;
var
  idtps:String;
  res:Boolean;
begin
  res:=True;
  with ZTable1 do
  begin
    Active:=False;
    TableName:='daftar_tps';
    Filter:='KODE_DESA='+QuotedStr(sdesa)+' AND NAMA='+QuotedStr(namatps);
    Filtered:=True;
    Active:=True;
    First;
  end;
  if (ZTable1.FieldByName('ID_TPS').AsString<>'') then begin
    idtps:=ZTable1.FieldByName('ID_TPS').AsString;
    with ZQuery1 do
    begin
      Active:=False;
      sql.Clear;
      SQL.Text:='SELECT count(*) FROM pemilih_'+sdesa+'WHERE TPS='+idtps;
      Active:=True;
      First;
      if (Fields[0].AsInteger+tambah)>600 then
        res:=False;
    end;
  end;
  Result:=res;
end;

procedure ttambah_orang.AutoSizeCol(Grid: TStringGrid; Column: integer);
var
  i, W, WMax: integer;
begin
  WMax := 0;
  for i := 0 to (Grid.RowCount - 1) do begin
    W := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
    if W > WMax then
      WMax := W;
  end;
  Grid.ColWidths[Column] := WMax + 5;
end;

function ttambah_orang.cekPemilihTPS(pemilih:TPemilih2):Boolean;
var
  idsimpan,iduser,idtps:String;
  tabel,kodpem:String;
  res:Boolean;
begin
  //true kalau kosong, false kalau ada
  res:=True;
  tabel:=Copy(pemilih.ID,1,16);
  iduser:=Copy(pemilih.ID,17,(Length(pemilih.ID)-16));
  kodpem:=iduser;
  ShowMessage(tabel+' '+kodpem);
  with ZTable1 do
  begin
    Active:=False;
    TableName:='daftar_tps';
    Filter:='KODE_DESA='+QuotedStr(Copy(tabel,9,8));
    Filtered:=True;
    Active:=True;
    First;
  end;
  if (ZTable1.FieldByName('ID_TPS').AsString<>'') then begin
    while (not ZTable1.Eof) do begin
      idtps:=ZTable1.FieldByName('ID_TPS').AsString;
      ShowMessage(idtps);
      with ZTable2 do
      begin
        Active:=False;
        //TableName:='pemilih_'+Copy(tabel,9,8);
        TableName:=tabel;
        Filter:='ID_USER='+QuotedStr(kodpem)+' AND TPS='+idtps;
        Filtered:=True;
        Active:=True;
        First;
        if (FieldByName('ID_USER').AsString<>'') then begin
          res:=False;
          break;
        end;
      end;
    ZTable1.Next
    end;
  end;
  ShowMessage('cek pem='+BoolToStr(res));
  Result:=res;
end;

function ttambah_orang.cekBufTPS(pemilih:TPemilih2):Boolean;
var
  Ok : boolean;
  I : Integer;
begin
  Ok:=True;
  for I := 1 to High(bTPS) do
  begin
    if (bTPS[I].ID=pemilih.ID) then begin
      Ok:=False;
      break;
    end;
  end;
  Result:=Ok;
end ;

procedure ttambah_orang.FetchDB();
var
  kode:String;
  query:String;
  kKota:String;
  kKec:String;
  kDesa:String;
  tblName:String;
  i:Integer;
  vRow:Integer;
begin
  dRow:=1;
  vRow:=1;
  fData:=False;
  jHal:=0;
  StringGrid1.RowCount:=2;
  lblHal.Caption:='-';
  //reset
  for i := 1 to StringGrid1.RowCount - 1
  do StringGrid1.Rows[i].Clear;
  //ganti
  if (sDesa<>'') then
    begin
      kode:=sDesa;
      kKota:='';//kabkotCombo.Items[kabkotCombo.ItemIndex];
      kKec:='';//kecCombo.Items[kecCombo.ItemIndex];
      kDesa:='';//keldesCombo.Items[keldesCombo.ItemIndex];
    end;
  query:='NAMA LIKE "pemilih_'+kode+'%"';
  ZQuery1.Active := False;
  query:= 'SELECT * FROM penyimpan WHERE '+query;
  ZQuery1.SQL.Text := query;
  ZQuery1.Active := True;
  ZQuery1.First;  //tabel simpan
  //ganti
    ZTable1.Active := False;
    tblName:=ZQuery1.FieldByName('NAMA').AsString;
    ZTable1.TableName := tblName;
    ZTable1.Filter:='RW='+QuotedStr(srw)+' AND RT='+QuotedStr( srt )+' AND TPS=0';  //get query
    ZTable1.Filtered := TRUE;
    ZTable1.Active := True;
    ZTable1.First;  //tabel
    dRow:=dRow+ZTable1.RecordCount;
    SetLength(bPemilih,dRow);
    lblPemilih.Caption:=IntToStr(drow-1);
    fData:=True;
    while (not ZTable1.Eof) do
      begin
        bPemilih[vRow].ID :=tblName+ZTable1.Fields[0].AsString;
        bPemilih[vRow].NIK:=ZTable1.Fields[1].AsString;
        bPemilih[vRow].NKK:=ZTable1.Fields[2].AsString;
        bPemilih[vRow].NAMA:=ZTable1.Fields[3].AsString;
        bPemilih[vRow].TEMPAT:=ZTable1.Fields[4].AsString;
        bPemilih[vRow].TANGGAL:=ZTable1.Fields[5].AsString;
        bPemilih[vRow].IBU:=ZTable1.Fields[6].AsString;
        bPemilih[vRow].AGAMA:=ZTable1.Fields[7].AsString;
        bPemilih[vRow].KAWIN:=ZTable1.Fields[8].AsString;
        bPemilih[vRow].KELAMIN:=ZTable1.Fields[9].AsString;
        bPemilih[vRow].KELAINAN:=ZTable1.Fields[10].AsString;
        bPemilih[vRow].ALAMAT:=ZTable1.Fields[11].AsString;
        bPemilih[vRow].KOTA:=kKota;
        bPemilih[vRow].KEC:=kKec;
        bPemilih[vRow].DESA:=kDesa;
        bPemilih[vRow].RW:=ZTable1.Fields[12].AsString;
        bPemilih[vRow].RT:=ZTable1.Fields[13].AsString;
        bPemilih[vRow].KET:=ZTable1.Fields[14].AsString;
        ZTable1.Next;
        vRow:=vRow+1;
      end;
    if (fData=True) then TampilHalamanTambah();
end;

procedure ttambah_orang.TampilHalamanTambah(Hal:Integer = 1);
var
  iter,i:Integer;
begin
  txtHal.Enabled:=True;
  bHal:=100;  //pemilih per halaman
  jHal:=(dRow-1) div bHal;
  if (((dRow-1) mod bHal)>0) then jHal:=jHal+1;
  lblHal.Caption := IntToStr(Hal)+' of '+IntToStr(jHal);
  cHal:=Hal;
  iter:=((Hal-1)*bHal)+1;
  crow2:=1;
  if (cHal=1) then
    btnPrev.Enabled:=False
  else
    btnPrev.Enabled:=True;
  if (cHal=jHal) then
    btnNext.Enabled:=False
  else
    btnNext.Enabled:=True;
  while ((iter<dRow) and (crow2<=bHal)) do
   begin
    StringGrid1.RowCount:=crow2+1;
    StringGrid1.Cells[0,crow2]:=IntToStr(iter);
    StringGrid1.Cells[1,crow2]:=bPemilih[iter].NIK;
    StringGrid1.Cells[2,crow2]:=bPemilih[iter].NKK;
    StringGrid1.Cells[3,crow2]:=bPemilih[iter].NAMA;
    StringGrid1.Cells[4,crow2]:=bPemilih[iter].TEMPAT;
    StringGrid1.Cells[5,crow2]:=bPemilih[iter].TANGGAL;
    StringGrid1.Cells[6,crow2]:=bPemilih[iter].IBU;
    StringGrid1.Cells[7,crow2]:=bPemilih[iter].AGAMA;
    StringGrid1.Cells[8,crow2]:=bPemilih[iter].KAWIN;
    StringGrid1.Cells[9,crow2]:=bPemilih[iter].KELAMIN;
    StringGrid1.Cells[10,crow2]:=bPemilih[iter].KELAINAN;
    StringGrid1.Cells[11,crow2]:=bPemilih[iter].ALAMAT;
    StringGrid1.Cells[12,crow2]:=bPemilih[iter].KOTA;
    StringGrid1.Cells[13,crow2]:=bPemilih[iter].KEC;
    StringGrid1.Cells[14,crow2]:=bPemilih[iter].DESA;
    StringGrid1.Cells[15,crow2]:=bPemilih[iter].RW;
    StringGrid1.Cells[16,crow2]:=bPemilih[iter].RT;
    StringGrid1.Cells[17,crow2]:=bPemilih[iter].KET;
    Inc(crow2);
    Inc(iter);
   end;
   for i := 0 to StringGrid1.ColCount - 1 do
    AutoSizeCol(StringGrid1, i);
end;


end.

